<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // // 1.字面量
        // var obj_0 = {}
        // // 2.内置构造函数
        // var obj_1 = new Object();
        // // 3.工厂模式
        // function Factory(name){
        //     var obj = {}
        //     obj.name = name;
        //     return obj
        // }
        // obj_2 = Factory(':·.')
        // // 4.自定义构造函数
        // function Person(name,age){
        //     this.name = name
        //     this.age = age
        // }
        // obj_3 = new Person('∵·∴')
    
        
        // new的实现

        // // new 的作用
        // // (1)创建一个空对象
        // // (2)this指向该对象
        // // (3)对象的隐式原型的函数的显式原型
        // // (4)隐式返还这个对象,返还this
        // function mynew(name,age){
        //     var obj = {};
        //     var res = Person.call(obj,name,age)
        //     obj.__proto__ = Person.prototype
        //     if(typeof(res)== 'undefined'){
        //         return obj;
        //     }else{
        //         return res
        //     }
        // }
    
        // var a = mynew(':·.','21')
        // console.log(a.name,a.age);
        // //5.Object.create(对象,配置参数)
        // var obj_4 = Object.create(null,{
        //     name:{
        //         value:'张三',
        //         writable:true,//配置对象,可写,默认false
        //         enumerable:true,//是否可以被循环,默认false
        //         configurable:true,//是否可配置                
        //     }
        // })
        // console.log('obj_4',obj_4);



        //通过存储器来配置 对象
        // 创建空的对象时需传null , 否则会抛出TypeError异常
            var obj_5 = Object.create(null,{
                name:{
                    // 不能设置value,会报错
                    get:function(){
                        // 获取属性值的时候自动调用get
                        return name
                    },
                    set:function(newValue){
                        // 设置属性值的时候自动调用set
                        console.log('修改了',newValue);
                        name = newValue
                    },
                    configurable:true,
                    enumerable:true,
                }
            })
            // 没有值的时候默认为'',空字符串

            // 获取值的时候自动调用
            obj_5.name = ":·."
            console.log(obj_5.name);
            obj_5.name = "∵·∴"
            // 设置的时候自动调用了
            console.log(obj_5.name);
            // 注意:这里闭包了
    </script>
</body>
</html>